gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/rec_process.m

    function errTB = rec_process(recSymb,Hcell,h,iUE,SNRdB)
% 接收端处理流程
% UE的基带处理函数,该函数仅用于数据信道,PDSCH在收端处理流程为:
% 天线逆映射-->OFDM解调-->去子载波映射-->去预编码 MIMO检测-->
% 去层映射-->解扰-->去速率匹配-->turbo译码-->CRC校验B-->CRC校验A
% 输出为第iUE个用户可用TB正确、错误接收指示
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ==========================================================
global LTE_par

Qm = LTE_par.UE_par.Qm(:,iUE);                            % 调制阶数
E = LTE_par.UE_par.E(:,iUE);                              % 速率匹配输出大小
CP = LTE_par.CP;                                          % 循环前缀长度
nCB = LTE_par.UE_par.nCB(:,iUE);                          % 获取当前用户CB数
nTB = LTE_par.UE_par.nCW(iUE);                            % TB数目
nRx = LTE_par.UE_par.nAnt;                                % 接收端天线数
RNTI = LTE_par.UE_par.RNTI;                               % 无线网络临时指示
nLayer = LTE_par.UE_par.nLayer(iUE);                      % 用户层数
cellID = LTE_par.BS_par.cellID;                           % 小区ID号
FFT_SIZE = LTE_par.FFT_SIZE;                              % FFT点数
M_0_SYMB = LTE_par.UE_par.M_0_SYMB(iUE);                  % 码字0调制符号数
iSubFrame = LTE_par.iSubFrame;                            % 当前子帧号 取值为0~9
preProcess = LTE_par.UE_par.preProcess;                   % 预处理模式

if LTE_par.channelFreq == false
    % ================ 去OFDM ==========================
    % 对每个接收天线上的符号去循环前缀,并做OFDM解调
    recMapSymbCell = de_ofdm(recSymb,FFT_SIZE,nRx,CP);
else
    recMapSymbCell = cell(nRx,1);
    row = size(recSymb,2);
    col = size(recSymb,3);
    for iRx = 1:nRx
        recMapSymbCell{iRx} = reshape(recSymb(iRx,:,:),row,col);
    end
end
% ================ 去频谱搬移 =======================
% 实现频域位置交换{B A}-->{A B}
for iRx = 1:nRx
    recMapSymbCell{iRx} = [recMapSymbCell{iRx}(FFT_SIZE/2+1:FFT_SIZE,:);recMapSymbCell{iRx}(1:FFT_SIZE/2,:)];
end

% ================ 去载波映射 =======================
recPrecodedSymb = de_subcarr_mapping(recMapSymbCell,iUE);
% 理想信道估计
HfreqCell = channel_est_real(Hcell,h,iUE);

% % ================ 去预编码 =========================
recLayersymb = de_precoding(recPrecodedSymb,HfreqCell,iUE,SNRdB);

% ================ 去层映射 =========================
recModSymbCell = de_layer_mapping(recLayersymb,nTB,nLayer,preProcess,M_0_SYMB);

errTB = zeros(nTB,1); % 当前传输块出错记录 % 非零值表示出错 0表示正确
for iTB = 1:nTB
    
    recModSymb = recModSymbCell{iTB};
    recScrambleBit = de_modulate(recModSymb,Qm(iTB));
    f = de_scramble(recScrambleBit,iTB,RNTI,iSubFrame,cellID);
    
    errCB = zeros(nCB(iTB),1); % 当前CB块出错记录
    saveInfoTB = [];
    
    for iCB = 1:nCB(iTB)
        
        % ============== 去码块级联 ====================
        begin = (iCB-1)*E(iTB)+1;
        ending = begin+E(iTB)-1;
        preDerateMatchBit = f(begin:ending);
        
        % ============= 去速率匹配 ====================
        preDecodeBit = de_rate_match(preDerateMatchBit,iUE,iTB);
        
        % ============= turbo 解码 ====================
        decodedBit = turbo_decoder(preDecodeBit,SNRdB);
        
        % ============= crc解校验 =====================
        if nCB(iTB) > 1
            err = crcCheck24b(decodedBit);
            saveInfoTB = [saveInfoTB decodedBit(1:end-24)];
        else
            err = crcCheck24a(decodedBit);
        end
        errCB(iCB) = err;
    end
    
    % ================ 码块合并后CRC24A 校验 ====================
    if nCB(iTB) > 1
        errTB(iTB) = crcCheck24a(saveInfoTB);
    else
        errTB(iTB) = errCB;
    end
    
end